package com.hina.rec.application.convert.system;

import com.hina.rec.domain.model.MenuDO;
import com.hina.rec.endpoint.req.system.MenuSaveReq;
import com.hina.rec.endpoint.req.system.MenuUpdateReq;
import com.hina.rec.endpoint.res.system.MenuRes;
import com.hina.rec.endpoint.res.system.MenuTreeRes;
import org.mapstruct.Mapper;
import org.mapstruct.factory.Mappers;

import java.util.List;

/**
 * 菜单对象转换器
 *
 * @author liaosp
 * @date 2024-01-10
 */
@Mapper
public interface MenuConvert {

    MenuConvert INSTANCE = Mappers.getMapper(MenuConvert.class);

    /**
     * 菜单实体转换为菜单响应对象
     *
     * @param menu 菜单实体
     * @return 菜单响应对象
     */
    MenuRes toMenuRes(MenuDO menu);

    /**
     * 菜单保存请求转换为菜单实体
     *
     * @param req 菜单保存请求
     * @return 菜单实体
     */
    MenuDO toMenuDO(MenuSaveReq req);

    /**
     * 菜单修改请求转换为菜单实体
     *
     * @param req 菜单修改请求
     * @return 菜单实体
     */
    MenuDO toMenuDO(MenuUpdateReq req);

    /**
     * 菜单实体列表转换为菜单响应对象列表
     *
     * @param menuList 菜单实体列表
     * @return 菜单响应对象列表
     */
    List<MenuRes> toMenuResList(List<MenuDO> menuList);

    /**
     * 菜单实体列表转换为简化菜单响应对象列表（只包含id、name、title和parentId字段）
     *
     * @param menuList 菜单实体列表
     * @return 简化菜单响应对象列表
     */
    List<MenuRes> toSimpleMenuResList(List<MenuDO> menuList);

    /**
     * 菜单实体列表转换为菜单树响应对象列表
     *
     * @param menus 菜单实体列表
     * @return 菜单树响应对象列表
     */
    List<MenuTreeRes> toMenuTreeResList(List<MenuDO> menus);
}